import java.sql.Connection;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
import javax.xml.crypto.Data;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 强仔
 * Date: 2022-01-13
 * Time: 15:31
 */
public class Test {
    public static void main(String[] args) throws SQLException {
        testSelect();
    }
    public static void testSelect() throws SQLException {
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java100?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("cuige2001");

        Connection connection = dataSource.getConnection();

        String sql = "select * from shandong";
        PreparedStatement statement = connection.prepareStatement(sql);

        //resultset就相当于一张临时表，在有些语言/库中ResultSet也叫光标（cursor） 如Python中
        ResultSet resultset = statement.executeQuery();

        while(resultset.next()){
            int id = resultset.getInt("id");
            String name = resultset.getString("name");
            System.out.println("id: " + id + ", name: " + name);
        }

        resultset.close();
        statement.close();
        connection.close();
    }

    public static void testUpdate() throws SQLException {
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java100?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("cuige2001");

        Connection connection = dataSource.getConnection();

        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入修改的名称");
        String name = scanner.next();
        System.out.println("请输入id");
        int id = scanner.nextInt();

        String sql = "Update shandong set name = ? where id = ?";
        PreparedStatement statement = connection.prepareStatement(sql);
        statement.setInt(2,id);
        statement.setString(1,name);

        int ret = statement.executeUpdate();
        System.out.println(ret);

        statement.close();
        connection.close();
    }
    public static void testDelete() throws SQLException {
        //1.创建数据源，把数据库的位置信息设置进去
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java100?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("cuige2001");
        //2.与数据库建立连接
        Connection connection = dataSource.getConnection();
        //3.构造SQL语句
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入需要删除城市的id");
        int id = scanner.nextInt();
        String sql = "delete from shandong where id = ?";
        PreparedStatement statement = connection.prepareStatement(sql);
        statement.setInt(1,id);
        //4.执行SQL语句
        int ret = statement.executeUpdate();
        System.out.println(ret);
        //5.回收资源
        statement.close();
        connection.close();
    }
    public static void testInsert() throws SQLException {
        //1.创建一个 数据源
        DataSource dataSource = new MysqlDataSource();
        // MysqlDataSource dataSource = new MysqlDataSource();
        // 把数据库的位置信息设置到DataSource中
        // 1)数据库的ip，端口，数据库名通过一个URL来表示，需要调用setUrl()实现，setUrl()是MysqlDataSource的方法
        ((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java100?characterEncoding=utf8&useSSL=false");
        // 2)设置登录数据库的用户名
        ((MysqlDataSource) dataSource).setUser("root");
        //MySQL支持自己创建用户，安装好MySQL数据库，就有一个用户，“root”，即管理员，拥有最高的权限
        // 3)设置登录数据库的密码
        ((MysqlDataSource) dataSource).setPassword("cuige2001");

        //2.连接数据库，进行网络通信
        Connection connection = dataSource.getConnection();
        //连接失败时会抛出异常（受查异常），导致连接失败的原因很多 ip地址、端口号、用户名、密码错误、数据库权限受阻等等

        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入id:");
        int id = scanner.nextInt();
        System.out.println("请输入城市:");
        String name = scanner.next();


        //3.创建SQL语句，插入数据
//      String sql = "insert into shandong values(1,'济南')";
//      String sql = "insert into shandong values("+ id + ",'"+ name + "')";
        //动态拼接SQL语句，? ?是占位符
        String sql = "insert into shandong values(?,?)";
        //SQL语句可能是动态拼接的，如id，name需要用户动态输入，PreparedStatement可以动态拼接SQL语句
        //用标准库的PreparedStatement，java.sql.PreparedStatement;
        PreparedStatement statement = connection.prepareStatement(sql);
        statement.setInt(1, id);
        statement.setString(2, name);
        //setXXX()对输入的内容有严格的校验，有疑似SQL语句的内容就能识别出来

        //4.执行SQL语句，进行网络通信
        //executeUpdate()返回的值是影响的行数
        //executeUpdate()表示数据发生变更，包括insert，update，delete等
        //executeQuery()表示查询
        int ret = statement.executeUpdate();
        System.out.println(ret);

        //5.关闭连接，回收一部分资源
        //客户端和服务器之间都会分配一部分资源来维系这个连接（记录对端的ip，port），每维持一个连接，都会消耗一部分硬件资源
        //调用close()的顺序是申请顺序的 "逆序"！！！  大门 二门
        statement.close();
        connection.close();
    }
}